package com.hongxin.nw.netty.model.analysis;

import com.hongxin.nw.netty.utils.BinaryTools;
import com.hongxin.nw.netty.utils.FieldAnalysis;
import com.hongxin.nw.netty.values.TypeIdentif;
import io.netty.buffer.ByteBuf;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * @remark 7.1.2应用规约控制信息（APCI)的定义
 * 应用规约控制信息（APCI）的定义如图3所示。每个APCI包括下列的定界元素：一个启动字符，APDU的长度，以及控制域，可以传送一个完整的APDU（或者，出于控制目的，仅仅是传送APCI域）。
 * @author: GuoXiaolin
 * @date 2019/5/16 18:07
 * @Version 1.0
 * @Descibe
 */
@Slf4j
@Getter
@Setter
public class APCI {

    private String indentStart;//起始符号:固定为68H
    private int APDULength;//A P D U长度域,2个八位位组,apci+asdu
    private String contArea;//控制域,4个八位位组

    private int idx=0;
    private ByteBuf byteBuf;

    public int analysisStr(ByteBuf byteBuf){
        this.byteBuf = byteBuf;
        subIndentStart();
        subAPDULength();
        subContArea();
        return idx;
    }

    private void subIndentStart() {
        int byteLength = TypeIdentif.BYTE_TYPE.getInt();
        this.indentStart = BinaryTools.subByteBuf(byteLength,idx, byteBuf);
        this.idx += byteLength;
    }
    private void subAPDULength() {
        int byteLength = TypeIdentif.BYTE_LENGTH_DOMAIN.getInt();
        String length = BinaryTools.subByteBuf(byteLength,idx, byteBuf);
        this.APDULength = Integer.parseInt(FieldAnalysis.analysisBin(length));
        this.idx += byteLength;
    }
    private void subContArea() {
        int byteLength = TypeIdentif.BYTE_CONTROL_DOMAIN.getInt();
        this.contArea = BinaryTools.subByteBuf(byteLength,idx, byteBuf);
        this.idx += byteLength;
    }

    @Override
    public String toString() {
        return "APCI{" +
                "indentStart='" + indentStart + '\'' +
                ", APDULength='" + APDULength + '\'' +
                ", contArea='" + contArea + '\'' +
                '}';
    }
}
